package com.itheima.lj.net;

import com.itheima.lj.utils.StreamUtil;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;


import static android.R.attr.data;

/**
 * Created by Administrator on 2017/9/2 0002.
 * 封装访问网络的方法的业务类
 */
public class OSChinaApi {

    //访问方式一 ：通过普通的HttpUrlConnection访问网络，获取数据的方法
    public static void getData(final String urlPath, final ResultRefresh listener) {
        //开子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //urlPath="http://10.0.2.2:8080/oschina/list/news/page0.xml";
                    URL url = new URL(urlPath);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    int responseCode = conn.getResponseCode();
                    if(responseCode==200){
                        //访问服务端成功
                        //取得输入流，  xml 流 ，把xml转成javabean
                        InputStream is = conn.getInputStream();
                        byte[] data= StreamUtil.streamConvertBytes(is);
                        //调用成功的回调方法
                        listener.onSuccess(data);
                    }else{
                        //todo  : 访问服务端出错
                        listener.onFailure("访问服务端出错");
                    }

                }catch (Exception e){
                    e.printStackTrace();
                    listener.onFailure("网络异常");
                    //todo  网络异常
                }
            }
        }).start();
    }


   //访问方式二：通过第三方的网络框架 访问网络
    public static void getData(String url, AsyncHttpResponseHandler handler){
        //构建一个网络访问对象
        AsyncHttpClient client=new AsyncHttpClient();
        //对AsyncHttpClient对象进行包装，设置公共的请求头
        client.addHeader("Accept-Language", "zh_CN");
        client.addHeader("Connection", "Keep-Alive");
        client.get(url,handler);
    }

    /**
     * 访问方式三：对网络访问框架进行二次封装
     * 1. 每一次请求都会构建一个网络访问框架 的对象  ，太耗内存
     * ？ 能不能用一个单一的对象来统一访问网络
     *    解决方式： 在Application中 构建一个单一的 网络请求框架 对象
     *
     * 2. 假如每次访问网络都用公共的请求头，cookie信息，那每次设置请求头，太麻烦
     * ？ 能不能对单一的 网络请求对象，进行再一次封装 ，把请求头信息一次设置好
     */
    public static void getData1(String url, AsyncHttpResponseHandler handler){
        ApiHttpClient.getData(url,handler);
    }

    /** 访问方式四 ：对业务层进行封装
     *     请求地址太复杂，不够灵活，拓展性不好 ，调用者希望依据不同的界面业务需求，封装请求
     *   比如： url ：http://10.0.2.2:8080/oschina/list/news/page1.xml
     *      改成： getNewsList()方法
     */
    //4.1 取得资讯列表的数据
    public static void getNewsList(int pagerIndex, AsyncHttpResponseHandler listener) {
        //realUrl="http://10.0.3.2:8080/oschina/list/news/page0.xml";
        String partUrl="/oschina/list/news/page"+pagerIndex+".xml";
        ApiHttpClient.getData(partUrl,listener);
    }
    //4.2 取得热点列表的数据
    public static void gethotSpotList(int pagerIndex, AsyncHttpResponseHandler listerner) {
        String partUrl="/oschina/list/hotspot/page"+pagerIndex+".xml";
        ApiHttpClient.getData(partUrl,listerner);
    }







    //访问网络后的回调接口
    public  interface  ResultRefresh{
        void onSuccess(byte[] datas);
        void onFailure(String errorMsg);
    }
}